package gui;


import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;

import tool.DefaultConceptIcon;

import mapelements.Renderer;

/** Il generico elemento che compare nell'elenco di
 *  una SelectionBox.
 * @author Daniele
 * @version 1.1 */
public class BoxElement extends JPanel implements MouseListener{

	private static final long serialVersionUID = 6819128386534968423L;
	
	/** Set di colori per tingere il bordo del BoxElement. */
	private static final ButtonColors COLORS = new ButtonColors(Color.BLUE, Color.RED, Color.GREEN, Color.DARK_GRAY);
	/** La larghezza perferita per il BoxElement.*/
	protected static final int PREFERRED_WIDTH = 50;
	/** L'altezza preferita per il BoxElement. */
	protected static final int PREFERRED_HEIGHT = 35;
	
	/** Il layout utilizzato per disporre i componenti. */
	private FlowLayout layout;
	/** La String che rappresenta il nome/descrizione dell'elemento. */
	private String name;
	/**rappresenta la classe che è rappresentata da questo elemento grafico*/
	private Class clazz;
	/** L'etichetta contenente la stringa name. */
	private JLabel nameLabel;
	/** L'icona che può eventualmente precedere il nome dell'elemento. */
	private Sample icon;
	/** Stato del colore del bordo. */
	private int colorState;

	/**costruisce una nuova boxElement con un'immagine di default
	 * 
	 * @param _name
	 */
	public BoxElement(String _name,Class _clazz){
		this(_name,_clazz, new DefaultConceptIcon());
	}
	
	
	public BoxElement(String _name,Class _clazz, Renderer _renderer){
		super();

		this.name = _name;
		this.clazz=_clazz;
		
		this.icon = new Sample(_renderer);
		colorState = 0;
		
		this.addMouseListener(this);
		layout = new FlowLayout(FlowLayout.LEFT);
		this.setLayout(layout);
		layout.setHgap(10);
		
		icon.setPreferredSize(new Dimension(30,30));
		this.add(this.icon);

		nameLabel = new JLabel(this.name);
		this.add(nameLabel);
	}
	
	public void dblClicked(MouseEvent event){
		this.colorState = 2;
		repaint();
	}
	
	@Override
	public void mouseClicked(MouseEvent arg0) {
	}

	/* Ricolora i bordi quando il puntatore sorvola il BoxElement. */
	@Override
	public void mouseEntered(MouseEvent arg0) {
		this.colorState = 1;
		repaint();
	}

	/* Ricolora i bordi quando il puntatore lascia il BoxElement. */
	@Override
	public void mouseExited(MouseEvent arg0) {
		this.colorState = 0;
		repaint();
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		this.colorState = 2;
		repaint();
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		this.colorState = 0;
		repaint();
	}

	/** Getter della String name. */
	@Override
	public String getName(){
		return this.name;
	}
	
	/**
	 * 
	 * @return la classe rappresentata da questo oggetto grafico
	 */
	public Class getClassContained(){
		return this.clazz;
	}
	
	public void paintBorder(Graphics g){
		Dimension size = this.getSize();
		Border border = BorderFactory.createLineBorder(BoxElement.COLORS.buttonColours[this.colorState]);
		border.paintBorder(this, g, 0, 0, size.width, size.height);
	}
}
